package org.example.leetcode;

/**
 * @version 1.0.0
 * @author: lynn
 * @description: 整数反转，不带符合和0
 * @date: 2021/7/24 9:51
 */
public class LC7 {
    public static void main(String[] args) {
        LC7 lc=new LC7();
        System.out.println(lc.reverse(2147483647));
        //2147483647,-2147483648
    }
    //fixme 知识点， x%10 是拿到最后一位， x/10 是拿到除了最后一位的剩下的数
    //fixme 风险点，−2^31≤out*10+digit≤2^31−1 在推入之前考虑溢出的情况,int 最大值是 2^31-1  最小值是 -2^31
    //fixme 判断某数是否会溢出，就用这个数，与 MAX_VALUE/10相比较
    public int reverse(int x) {
        int out=0;
        while (x!=0){
            int digit=x%10;//最后一位
            if (out>Integer.MAX_VALUE/10 || out<Integer.MIN_VALUE/10
                    || (out==Integer.MAX_VALUE/10 && digit>7)
                    || (out==Integer.MIN_VALUE/10 && digit<-8)
            )
                return 0;
            x=x/10;//剩余位数
            //fixme 不能在这里判断 −2^31≤rev⋅10+digit≤2^31−1 ，只能是倒过来判断 out>Integer.MAX_VALUE/10 || out<Integer.MIN_VALUE/10
            out=out*10+digit;
        }
        return out;
    }
}
